
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>分布式追踪系统实践 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>分布式追踪系统实践 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">概念</div>
          <div class="card-question">分布式追踪中的三个核心概念是什么？请分别解释它们的作用。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">概念</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">分布式追踪的三个核心概念是 Trace ID、Span 和 Span Context。Trace ID 是全局唯一的标识，用于关联一个请求在所有服务中的事件。Span 表示一个服务对请求的一次处理过程，包含时间、操作名等信息。Span Context 是在不同服务间传递 Span 相关信息的载体，包含 Trace ID 和 Span ID，以确保调用链的连续性。</div>
          </div>
          <div class="card-source">来源: 分布式追踪的关键概念</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">为什么在微服务架构中需要引入分布式追踪系统？它能解决哪些主要问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为在微服务架构中，一个请求会在多个分布式服务间流转，难以追踪其完整路径和性能。分布式追踪系统主要解决三大问题：1. 性能优化：通过分析调用链找出耗时长的服务进行优化。2. 故障排查：当系统出现故障时，能快速定位到返回错误的服务。3. 系统监控：通过分析追踪数据了解系统整体运行状况，发现潜在问题。</div>
          </div>
          <div class="card-source">来源: 为什么需要分布式追踪</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">分布式追踪系统中的数据采集通常有哪两种方式？它们有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">数据采集通常有自动埋点和手动埋点两种方式。自动埋点是通过引入SDK自动在服务入口、出口和关键代码段（如HTTP请求）插入追踪代码，如Spring Cloud Sleuth。手动埋点则是在自动埋点无法覆盖的复杂业务逻辑中，由开发者手动插入代码来创建Span，以实现更精细的控制。</div>
          </div>
          <div class="card-source">来源: 数据采集</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">文档中介绍了哪三个主流的分布式追踪系统？请简述它们各自的一个显著特点。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档介绍了 Zipkin、Jaeger 和 SkyWalking。1. Zipkin：由Twitter开源，较为成熟，易于部署和使用，拥有简洁的Web界面。2. Jaeger：由Uber开源，支持采样等高级特性，架构灵活，适合大规模分布式系统。3. SkyWalking：国产系统，对Java应用支持良好，不仅提供追踪功能，还集成了性能监控。</div>
          </div>
          <div class="card-source">来源: 主流分布式追踪系统介绍</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">原则</div>
          <div class="card-question">根据文档，在为项目选择分布式追踪系统时，需要考虑哪四个关键因素？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">原则</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">选型时需要考虑四个关键因素：1. 性能：追踪系统本身对应用程序的性能影响要小。2. 功能特性：需满足项目的实际需求，如采样策略、跨语言支持等。3. 可扩展性：系统应能适应未来业务规模的扩大，包括存储和处理能力。4. 集成难度：应选择易于与现有技术栈集成的系统，以降低开发成本。</div>
          </div>
          <div class="card-source">来源: 选型考虑因素</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">实践</div>
          <div class="card-question">在“性能优化案例”中，ts项目团队是如何利用分布式追踪系统发现并解决订单创建响应时间长的问题的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">实践</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">团队通过Zipkin的调用链分析发现，订单创建响应时间长是因为库存服务在检查库存时数据库查询耗时过长。进一步分析发现是查询语句没有合理使用索引。团队对查询语句进行优化并添加索引后，库存服务的处理时间大幅缩短，从而改善了订单创建的整体响应时间。</div>
          </div>
          <div class="card-source">来源: 实际案例分析 - 性能优化案例</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">采集到的追踪数据是如何传输和存储的？文档中提到了哪些具体的技术方案？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">采集到的数据需要传输到集中式系统。传输协议常用HTTP或UDP。数据存储方案常见的有Elasticsearch和Cassandra。Elasticsearch具有强大的搜索分析功能，而Cassandra以高可用性和可扩展性著称。在ts项目中，使用HTTP协议将数据传输到Zipkin服务器，并使用Elasticsearch进行存储。</div>
          </div>
          <div class="card-source">来源: 数据传输 & 数据存储</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">概念</div>
          <div class="card-question">什么是 Trace ID？在 ts 项目中，它是如何生成并贯穿整个调用链的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">概念</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Trace ID 是一个全局唯一的标识，用于关联一个请求在整个分布式系统中的所有相关事件。在 ts 项目中，当一个外部请求进入网关时，网关会生成一个 Trace ID，并将其添加到请求头中。之后所有处理该请求的服务都会从请求头中获取这个 Trace ID，从而确保整个调用链的连贯性。</div>
          </div>
          <div class="card-source">来源: 分布式追踪的关键概念 - Trace ID</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">实践</div>
          <div class="card-question">ts 项目引入分布式追踪系统的完整流程包含哪几个步骤？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">实践</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">ts 项目引入分布式追踪系统的流程分为四步：1. 需求分析：明确要解决的目标，如可视化调用链、定位瓶颈等。2. 系统选型：调研并评估主流系统，最终选择Zipkin。3. 系统部署：搭建Zipkin服务器和Elasticsearch后端，并在各微服务中引入依赖和配置。4. 数据验证和优化：验证采集数据的准确性，并根据业务场景优化采样率等参数。</div>
          </div>
          <div class="card-source">来源: 引入分布式追踪系统的过程</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
